#pragma once
#include<iostream>
#include<string>
#include"InetAddr.hpp"
#include<set>
#include<cstdio>
#include"Log.hpp"
//命令模块
using namespace LogModule;
class Command
{
public:
    Command()
    {
        //严格匹配
        _whiteListCommands.insert("ls");
        _whiteListCommands.insert("pwd");
        _whiteListCommands.insert("ls -l");
        _whiteListCommands.insert("touch haha.txt");
        _whiteListCommands.insert("who");
        _whiteListCommands.insert("whoami");
    }
    
    bool IsSageCommand(const std::string&cmd)
    {
        auto iter=_whiteListCommands.find(cmd);
        return iter!=_whiteListCommands.end();//查到了就返回true
    }
    std::string Excute(const std::string&cmd,InetAddr &addr)
    {
        //1、属于白名单命令（无条件信任）
        if(!IsSageCommand(cmd))//如果命令是安全的话就是为true的
        {
            return std::string("坏人"); 
        }
        std::string who=addr.StringAddr();//客户端是谁
        //2、执行命令
        //底层执行命令，创建管道啥的，执行完命令后将结果放到管道中，我们通过文件进行读取操作
        FILE* fp = popen(cmd.c_str(), "r");
        if(nullptr == fp)//打开命令失败的情况下，说明本身命令不存在
        {
            return std::string("你要执行的命令不存在")+cmd;
        }
        
        std::string result;
        char line[1024];//缓冲区
        while(fgets(line,sizeof(line),fp));//缓冲区、缓冲区大小、文件名
        {
            result+=line;//追加结果
        }
        pclose(fp);//关掉fp
        std::string result= who+"excute done ,result is \n"+result;
        LOG(LogLevel::DEBUG)<<result;
        return result;
    }
    ~Command(){}
private:
    //受限制的远程执行
    //以后只允许执行在白名单中的命令
    std::set<std::string> _whiteListCommands;//白名单

}; 